#include<bits/stdc++.h>
using namespace std;
#define ld long double
#define ll long long
#define M 3005
#define ll long long
#define mid ((l+r)>>1)
#define ls p*2
#define eps 1e-7
#define rs (p*2)+1
struct car{
    ld d=0,v=0,a=0, l=0,r=0;
}c[M];
int d[M];
ld v1(int v0,int s,int a){
    return sqrt((ll)(pow(v0,2))+2*a*s);
}


const int MINN=107;
const int MAXN=MINN*4;
ll t[MAXN],a[MINN],lz[MAXN];

void build(int l,int r,int p){
    if(l==r)t[p]=a[l];
    else {
        build(l,mid,ls);
        build(mid+1,r,rs);
        t[p]=t[ls]+t[rs];
    }
}
void push_up(int &p){t[p]=t[ls]+t[rs];}
void push_down(int l,int r,int p){
    lz[ls]+=lz[p];
    lz[rs]+=lz[p];
    t[ls]+=(l-mid+1)*lz[p];
    t[rs]+=(r-mid)*lz[p];
    lz[p]=0;
}
void add(int l,int r,int ql,int qr,ll k,int p){
    if(ql<=l&&qr>=r){
        t[p]+=(r-l+1)*k;
        lz[p]+=k;
        return ;
    }
    push_down(l,r,p);
    if(ql<=mid)add(l,mid,ql,qr,k,ls);
    if(qr>mid)add(mid+1,r,ql,qr,k,rs);
    push_up(p);
}
int main(){
    int t;
    //freopen("detect.in","r",stdin);
   // freopen("detect.out","w+",stdout);
    cin>>t;while(t--){
    ld n,m,l,v;int sum=0;
    cin>>n>>m>>l>>v;
    //sum=n;
        for(int i=1;i<=n;i++){
            cin>>c[i].d>>c[i].v>>c[i].a;
            if(c[i].a==0){
                if(c[i].v>v)c[i].r=l,c[i].l=c[i].d;
                else c[i].r=0,c[i].l=0;
            }
            else if(c[i].a>0){
               c[i].l=(v*v-c[i].v*c[i].v)/2/c[i].a+c[i].d+eps,c[i].r=l;
            }
            else {
                 if(c[i].v>v)c[i].l=c[i].d,c[i].r=(v*v-c[i].v*c[i].v)/2/c[i].a+c[i].d-eps;
                 else c[i].r=0;
            }
        }int cnt[3007]={0},tmp[3007]={0},ans=0,ans2=1e9,ans3=0;
        for(int i=1;i<=m;i++)scanf("%d",&d[i]);
        
            for(int j=1;j<=n;j++){
                for(int i=1;i<=m;i++){
                    if(c[j].l<=d[i]&&c[j].r>=d[i]){sum++;break;}
                }
            }
        
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(c[j].l<=d[i]&&c[j].r>=d[i]){
                    if(tmp[j]==0)ans3++;
                    else{
                    cnt[tmp[j]]--;
                    if(cnt[tmp[j]]==0)ans--;
                    }
                    tmp[j]=i;
                    if(cnt[i]==0)ans++;
                    cnt[i]++;
                }
            }
            if(ans3==sum)ans2=min(ans2,ans);
        }
        cout<<sum<<' '<<n-ans2<<endl;
        
    }
    
    return 0;
}